#include <iostream>
#include <fstream>

using namespace std;

/**
 * 文件和流
*/

// 1. #include <fstream>

// 2. 流数据类型
// ofstream	该数据类型表示输出文件流，用于创建文件并向文件写入信息。
// ifstream	该数据类型表示输入文件流，用于从文件读取信息。
// fstream	该数据类型通常表示文件流，且同时具有 ofstream 和 ifstream 两种功能，这意味着它可以创建文件，向文件写入信息，从文件读取信息。

// 3. 打开文件
// 在从文件读取信息或者向文件写入信息之前，必须先打开文件。ofstream 和 fstream 对象都可以用来打开文件进行写操作，如果只需要打开文件进行读操作，则使用 ifstream 对象。
// void open(const char *filename, ios::openmode mode);

// 4. 文件被打开的模式：
// ios::app	追加模式。所有写入都追加到文件末尾。
// ios::ate	文件打开后定位到文件末尾。
// ios::in	打开文件用于读取。(必选)
// ios::out	打开文件用于写入。（必选）
// ios::trunc	如果该文件已经存在，其内容将在打开文件之前被截断，即把文件长度设为 0。（默认）

// 5. 文件位置指针
// istream : seekg（"seek get"）
// ostream : seekp（"seek put"）
// seekg 和 seekp 的参数通常是一个长整型。
// 第二个参数指定查找方向:
// ios::beg（默认的，从流的开头开始定位），
// ios::cur（从流的当前位置开始定位），
// ios::end（从流的末尾开始定位）。

int main(){

    string s = "写入文件的字符串";

    // 以读写的方式打开文件
    fstream f;
    f.open("file.txt", ios::out | ios::in);

    // 向文件写入数据
    f << s;

    string outstr;
    // 文件位置指针定位到第0个字节
    f.seekg(0);

    // 从文件读出数据
    f >> outstr;

    // 关闭文件
    f.close();

    cout << outstr << endl;

}

int io_fstream ()
{
    
   char data[100];
 
   // 以写模式打开文件
   ofstream outfile;
   outfile.open("afile.dat");
 
   cout << "Writing to the file" << endl;
   cout << "Enter your name: "; 
   cin.getline(data, 100);
 
   // 向文件写入用户输入的数据
   outfile << data << endl;
 
   cout << "Enter your age: "; 
   cin >> data;
   cin.ignore();
   
   // 再次向文件写入用户输入的数据
   outfile << data << endl;
 
   // 关闭打开的文件
   outfile.close();
 
   // 以读模式打开文件
   ifstream infile; 
   infile.open("afile.dat"); 
 
   cout << "Reading from the file" << endl; 
   infile >> data; 
 
   // 在屏幕上写入数据
   cout << data << endl;
   
   // 再次从文件读取数据，并显示它
   infile >> data; 
   cout << data << endl; 
 
   // 关闭打开的文件
   infile.close();
 
   return 0;
}